package com.sigmatrix.h5.service;

import java.util.List;
import java.util.Map;

import com.sigmatrix.h5.dto.ProductData;
import com.sigmatrix.h5.dto.QRCodeError;
import com.sigmatrix.h5.entity.FirstLevelQRCode;
import com.sigmatrix.h5.exception.ServiceException;
import com.sigmatrix.h5.web.args.AnalysisParam;
import com.sigmatrix.h5.web.args.QueryQrCodeParam;
import com.sigmatrix.h5.web.mode.Analysis;
import com.sigmatrix.h5.web.mode.QrCode;
import com.sigmatrix.sc.mongo.common.service.MongoService;

/**
 * 
 *@ClassName: FirstLevelQrCodeService
 *@Description: 多级码表
 *@author MH
 *@date 2017年9月22日 上午9:50:38
 */
public interface FirstLevelQrCodeService extends MongoService<FirstLevelQRCode>{
	
	/**
	 * 
	 *@Title: findByCode
	 *@Description: 优先根据qrCode查询,如果qrCode为空就根据友好码查询，
	 *	如果都为空就抛出ServiceException
	 *@return QrCode
	 *@author MH
	 *@date 2017年9月25日 上午9:59:14
	 *@param QueryQrCodeParam
	 *@return
	 */
	QrCode findByCode(QueryQrCodeParam vo);
	
	/**
	 * 
	 *@Title: findByFriendlyCode
	 *@Description: 通过友好码查询
	 *@return FirstLevelQRCode
	 *@author MH
	 *@date 2017年9月27日 上午9:54:14
	 *@param friendlyCode
	 *@return
	 */
	FirstLevelQRCode findByFriendlyCode(String friendlyCode);
	
	/**
	 * 
	 *@Title: findBySeqNum
	 *@Description: 通过seqNum查询
	 *@return FirstLevelQRCode
	 *@author MH
	 *@date 2017年9月27日 上午9:54:28
	 *@param seqNum
	 *@return
	 */
	FirstLevelQRCode findBySeqNum(String seqNum);


	/**
	 * 
	 * @param seqNum
	 * @return
	 */
	FirstLevelQRCode findBySeqNum(String seqNum,String eseCode);
	
	/**
	 * 
	 *@Title: findByQRCode
	 *@Description: 通过QRCode查询
	 *@return FirstLevelQRCode
	 *@author MH
	 *@date 2017年9月27日 上午9:55:07
	 *@param qrCode
	 *@return
	 */
	FirstLevelQRCode findByQRCode(String qrCode);
	
	/**
	 * 
	 * @param qrCode
	 * @return
	 */
	FirstLevelQRCode findByQRCode(String qrCode, String eseCode);
	
	/**
	 * 
	 *@Title: analysis
	 *@Description: 分析是否窜货
	 *@return QrCode
	 *@author MH
	 *@date 2017年9月29日 下午4:21:50
	 *@param vo
	 *@return
	 */
	Analysis analysis(AnalysisParam vo);
	
	/**
	 *@Title: findFirstLevelQRCodeByQRCode
	 *@Description: 根据一级码查找企业一级码信息
	 *@return FirstLevelQRCode
	 *@author youjun
	 *@date 2017年8月7日 下午2:29:00
	 *@param enterpriseCode
	 *@param qRCode
	 *@param isNeedConversion 码是否需要进行转换操作
	 *@return
	 *@throws ServiceException
	 */
	FirstLevelQRCode findFirstLevelQRCodeByQRCode(final String enterpriseCode, final String qRCode, final boolean isNeedConversion) throws ServiceException;

	/**
	 *@Title: findFirstLevelQRCodeByCodeAndCodeType
	 *@Description: 根据码及码类型查找一级码
	 *@return FirstLevelQRCode
	 *@author youjun
	 *@date 2017年8月8日 下午3:08:58
	 *@param enterpriseCode 企业code
	 *@param code 码
	 *@param isNeedConversion 是否需要对码进行转换
	 *@param codeType 码类型,目前支持两种:1、标准码 2、友好码
	 *@return
	 *@throws ServiceException
	 */
	FirstLevelQRCode findFirstLevelQRCodeByCodeAndCodeType(String enterpriseCode, String code, boolean isNeedConversion,
			int codeType) throws ServiceException;

	/**
	 *@Title: update
	 *@Description: TODO()
	 *@return void
	 *@author youjun
	 *@date 2017年8月14日 上午11:00:07
	 *@param item
	 */
	void update(FirstLevelQRCode item) throws ServiceException;

	/**
	 *@Title: validateSingleLevelCode
	 *@Description: 验证单品码:非空、不包含父码、非出库/入库状态,返回错误瓶数
	 *@return void
	 *@author youjun
	 *@date 2017年8月12日 上午2:01:35
	 *@param qRCodeErrorList
	 *@param firstLevelQRCode
	 *@param operateCode 手持<b>直接</b>上传的是瓶码就传入,否则传入""
	 *@param product
	 *@param isSelf 是否为一级码本身
	 *@param type 1为出库,2为入库
	 * @throws ServiceException 
	 */
	int validateSingleLevelCode(List<QRCodeError> qRCodeErrorList, FirstLevelQRCode firstLevelQRCode,
			String operateCode, ProductData product, boolean isSelf, int type) throws ServiceException;

	/**
	 *@Title: batchSplitOrFillParentCode
	 *@Description: 批量拆除或填充一批码的上级码关系
	 *@return void
	 *@author youjun
	 *@date 2017年8月19日 上午11:35:40
	 *@param enterpriseCode 企业code
	 *@param operateCodeList 批量的码
	 *@param parentCode
	 * @throws ServiceException 
	 */
	void batchSplitOrFillParentCode(String enterpriseCode, List<String> operateCodeList, String parentCode) throws ServiceException;

	/**
	 *@Title: findFirstLevelQRCodeListByCondition
	 *@Description: TODO()
	 *@return List<FirstLevelQRCode>
	 *@author youjun
	 *@date 2017年8月21日 下午1:44:40
	 *@param firstLevelQRCodeCondition
	 *@return
	 */
	List<FirstLevelQRCode> findFirstLevelQRCodeListByCondition(FirstLevelQRCode firstLevelQRCodeCondition) throws ServiceException;

	/**
	 *@Title: batchUpdateByQrCodeList
	 *@Description: 批量更新一组码的相关信息
	 *@return void
	 *@author youjun
	 *@date 2017年8月22日 下午3:47:44
	 *@param updateFirstCode
	 *@param qrCodeList
	 * @throws ServiceException 
	 */
	void batchUpdateByQrCodeList(FirstLevelQRCode updateFirstCode, List<String> qrCodeList) throws ServiceException;
	
}
